#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QIcon>
#include<QContextMenuEvent>
#include<QMessageBox>
#include<QJsonDocument>
#include<QJsonObject>
#include<QJsonArray>
#include<QPainter>

#define INCREMENT 3
#define POINT_RADIUS 3
#define TEXT_OFFSET_X 12
#define TEXT_OFFSET_Y 12

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    setWindowFlag(Qt::FramelessWindowHint);//设置窗口无边框
    setFixedSize(width(),height());//设置窗口固定大小

    //构建右键菜单
    mExitMenu = new QMenu(this);
    mExitAct = new QAction();

    mExitAct->setText("退出");
    mExitAct->setIcon(QIcon(":/close.png"));

    mExitMenu->addAction(mExitAct);

    connect(mExitAct,&QAction::triggered,this,[=](){
        qApp->exit(0);
    });

    //将控件添加到控件数组
    //星期和日期
    mWeekList << ui->lblWeek0 << ui->lblWeek1 << ui->lblWeek2 << ui->lblWeek3 << ui->lblWeek4 << ui->lblWeek5;
    mDateList << ui->lblDate0 << ui->lblDate1 << ui->lblDate2 << ui->lblDate3 << ui->lblDate4 << ui->lblDate5;

    //天气和图标
    mTypeList << ui->lblType0 << ui->lblType1 << ui->lblType2 << ui->lblType3 << ui->lblType4 << ui->lblType5;
    mTypeIconList << ui->lblTypeIcon0 << ui->lblTypeIcon1 << ui->lblTypeIcon2 << ui->lblTypeIcon3 << ui->lblTypeIcon4 << ui->lblTypeIcon5;

    //天气指数
    mAqiList << ui->lblQuality0 << ui->lblQuality1 << ui->lblQuality2 << ui->lblQuality3 << ui->lblQuality4 << ui->lblQuality5;

    //风向和风力
    mFxList << ui->lblFx0 << ui->lblFx1 << ui->lblFx2 << ui->lblFx3 << ui->lblFx4 << ui->lblFx5;
    mFlList << ui->lblFl0 << ui->lblFl1 << ui->lblFl2 << ui->lblFl3 << ui->lblFl4 << ui->lblFl5;

    mTypeMap.insert("暴雪",":/type/BaoXue.png");
    mTypeMap.insert("暴雨",":/type/BaoYu.png");
    mTypeMap.insert("暴雨到大暴雨",":/type/BaoYuDaoDaBaoYu.png");
    mTypeMap.insert("大暴雨",":/type/DaBaoYu.png");
    mTypeMap.insert("大暴雨到特大暴雨",":/type/DaBaoYuDaoTeDaBaoYu.png");
    mTypeMap.insert("大到暴雪",":/type/DaDaoBaoXue.png");
    mTypeMap.insert("大到暴雨",":/type/DaDaoBaoYu.png");
    mTypeMap.insert("大雪",":/type/DaXue.png");
    mTypeMap.insert("大雨",":/type/DaYu.png");
    mTypeMap.insert("冬雨",":/type/DongYu.png");
    mTypeMap.insert("多云",":/type/DuoYun.png");
    mTypeMap.insert("浮尘",":/type/FuChen.png");
    mTypeMap.insert("雷阵雨",":/type/LeiZhenYu.png");
    mTypeMap.insert("雷阵雨伴有冰雹",":/type/LeiZhenYuBanYouBingBao.png");
    mTypeMap.insert("霾",":/type/Mai.png");
    mTypeMap.insert("强沙尘暴",":/type/QiangShaChenBao.png");
    mTypeMap.insert("晴",":/type/Qing.png");
    mTypeMap.insert("沙尘暴",":/type/ShaChenBao.png");
    mTypeMap.insert("特大暴雨",":/type/TeDaBaoYu.png");
    mTypeMap.insert("无数据",":/type/undefined.png");
    mTypeMap.insert("雾",":/type/Wu.png");
    mTypeMap.insert("小到中雪",":/type/XiaoDaoZhongXue.png");
    mTypeMap.insert("小到中雨",":/type/XiaoDaoZhongYu.png");
    mTypeMap.insert("小雪",":/type/XiaoXue.png");
    mTypeMap.insert("小雨",":/type/XiaoYu.png");
    mTypeMap.insert("雪",":/type/Xue.png");
    mTypeMap.insert("扬沙",":/type/YangSha.png");
    mTypeMap.insert("阴",":/type/Yin.png");
    mTypeMap.insert("雨",":/type/Yu.png");
    mTypeMap.insert("雨加雪",":/type/YuJiaXue.png");
    mTypeMap.insert("阵雪",":/type/ZhenXue.png");
    mTypeMap.insert("阵雨",":/type/ZhenYu.png");
    mTypeMap.insert("中到大雪",":/type/ZhongDaoDaXue.png");
    mTypeMap.insert("中到大雨",":/type/ZhongDaoDaYu.png");
    mTypeMap.insert("中雪",":/type/ZhongXue.png");
    mTypeMap.insert("中雨",":/type/ZhongYu.png");


    //网络请求
    mNetAccessManager = new QNetworkAccessManager(this);
    connect(mNetAccessManager,&QNetworkAccessManager::finished,this,&MainWindow::onReplied);

    //getWeatherInfo("101010100");
    getWeatherInfo("101280101");

    //添加事件过滤器
    ui->lblHighCurve->installEventFilter(this);
    ui->lblLowCurve->installEventFilter(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{
    mExitMenu->exec(QCursor::pos());

    event->accept();
}

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    mOffSet = event->globalPos() - this->pos();
}

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    this->move(event->globalPos()-mOffSet);
}

void MainWindow::getWeatherInfo(QString citycode)
{
    QUrl url("http://t.weather.itboy.net/api/weather/city/"+citycode);
    mNetAccessManager->get(QNetworkRequest(url));
}

void MainWindow::parseJson(QByteArray &byteArray)
{
    QJsonParseError err;
    QJsonDocument doc = QJsonDocument::fromJson(byteArray,&err);
    if(err.error != QJsonParseError::NoError)
    {
        return;
    }

    QJsonObject rootObj = doc.object();
    qDebug()<<rootObj.value("message").toString();
    //1.解析日期和城市
    mToday.date = rootObj.value("date").toString();
    mToday.city = rootObj.value("cityInfo").toObject().value("city").toString();
    //2.解析yesterday
    QJsonObject objData = rootObj.value("data").toObject();
    QJsonObject objYesterday = objData.value("yesterday").toObject();

    mDay[0].week = objYesterday.value("week").toString();
    mDay[0].date = objYesterday.value("date").toString();
    mDay[0].type = objYesterday.value("type").toString();

    QString s;
    s = objYesterday.value("high").toString().split(" ").at(1);
    s = s.left(s.length()-1);
    mDay[0].high = s.toInt();

    s = objYesterday.value("low").toString().split(" ").at(1);
    s = s.left(s.length()-1);
    mDay[0].low = s.toInt();

    //风向风力
    mDay[0].fx = objYesterday.value("fx").toString();
    mDay[0].fl = objYesterday.value("fl").toString();
    //污染指数
    mDay[0].aqi = objYesterday.value("aqi").toDouble();

    //3.解析forcast中5天的数据
    QJsonArray forecastArr = objData.value("forecast").toArray();

    for(int i=0;i<5;i++)
    {
        QJsonObject objForecast = forecastArr[i].toObject();

        mDay[i+1].week = objForecast.value("week").toString();
        mDay[i+1].type = objForecast.value("type").toString();
        mDay[i+1].date = objForecast.value("date").toString();

        //高温低温
        QString s;
        s = objForecast.value("high").toString().split(" ").at(1);
        s = s.left(s.length()-1);
        mDay[i+1].high = s.toInt();

        s = objForecast.value("low").toString().split(" ").at(1);
        s = s.left(s.length()-1);
        mDay[i+1].low = s.toInt();
        //风向风力
        mDay[i+1].fx = objForecast.value("fx").toString();
        mDay[i+1].fl = objForecast.value("fl").toString();

        //污染指数
        mDay[i+1].aqi = objForecast.value("aqi").toDouble();
    }
    //4.解析今天的数据
    mToday.ganmao = objData.value("ganmao").toString();
    mToday.wendu = objData.value("wendu").toString().toDouble();
    mToday.shidu = objData.value("shidu").toString();
    mToday.pm25 = objData.value("pm25").toDouble();
    mToday.quality = objData.value("quality").toString();
    //forecast中第一个数组元素，也是今天的数据
    mToday.type = mDay[1].type;
    mToday.fx = mDay[1].fx;
    mToday.fl = mDay[1].fl;
    mToday.high = mDay[1].high;
    mToday.low = mDay[1].low;

    //更新UI
    updateUI();

    ui->lblHighCurve->update();
    ui->lblLowCurve->update();
}

void MainWindow::updateUI()
{
    //更新日期和城市
    ui->lblDate->setText(QDateTime::fromString(mToday.date,"yyyymmdd").toString("yyyy/mm/dd") + " " + mDay[1].week);
    ui->lblCity->setText(mToday.city);

    //更新今天
    ui->lblTypeIcon->setPixmap(mTypeMap[mToday.type]);
    ui->lblTemp->setText(QString::number(mToday.wendu));
    ui->lblType->setText(mToday.type);
    ui->lblLowHigh->setText(QString::number(mToday.low) + "~" + QString::number(mToday.high) + "°C");

    ui->lblGanMao->setText("感冒指数" + mToday.ganmao);

    ui->lblWindFx->setText(mToday.fx);
    ui->lblWindFl->setText(mToday.fl);

    ui->lblPM25->setText(QString::number(mToday.pm25));

    ui->lblShiDu->setText(mToday.shidu);
    ui->lblQuality->setText(mToday.quality);

    //更新六天
    for(int i =0;i<6;i++)
    {
        //更新日期和时间
        mWeekList[i]->setText("周" + mDay[i].week.right(1));
        mWeekList[0]->setText("昨天");
        mWeekList[1]->setText("今天");
        mWeekList[2]->setText("明天");

        QStringList ymdList = mDay[i].date.split("-");
        //qDebug() <<  mDateList.size();
        //qDebug() <<  i;
        //qDebug() << ymdList.size();
        //mDateList[i]->setText(ymdList[0]);// ！！！！！！！！！！！！
        //更新天气类型
        mTypeList[i]->setText(mDay[i].type);
        mTypeIconList[i]->setPixmap(mTypeMap[mDay[i].type]);

        //更新空气质量
        if(mDay[i].aqi>=0 && mDay[i].aqi<=50)
        {
            mAqiList[i]->setText("优");
            mAqiList[i]->setStyleSheet("background-color:rgb(121,184,0)");
        }else if(mDay[i].aqi>50 && mDay[i].aqi<=100)
        {
            mAqiList[i]->setText("良");
            mAqiList[i]->setStyleSheet("background-color:rgb(255,187,23)");
        }else if(mDay[i].aqi>100 && mDay[i].aqi<=150)
        {
            mAqiList[i]->setText("轻度");
            mAqiList[i]->setStyleSheet("background-color:rgb(255,87,97)");
        }else if(mDay[i].aqi>150 && mDay[i].aqi<=200)
        {
            mAqiList[i]->setText("中度");
            mAqiList[i]->setStyleSheet("background-color:rgb(235,17,27)");
        }else if(mDay[i].aqi>200 && mDay[i].aqi<=250)
        {
            mAqiList[i]->setText("重度");
            mAqiList[i]->setStyleSheet("background-color:rgb(170,0,0)");
        }else
        {
            mAqiList[i]->setText("严重");
            mAqiList[i]->setStyleSheet("background-color:rgb(110,0,0)");
        }

        //更新风力风向
        mFlList[i]->setText(mDay[i].fl);
        mFxList[i]->setText(mDay[i].fx);

    }



}

bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == ui->lblHighCurve && event->type() == QEvent::Paint)
    {
        paintHighCurve();
    }

    if(watched == ui->lblLowCurve && event->type() == QEvent::Paint)
    {
        paintLowCurve();
    }

    return QWidget::eventFilter(watched,event);
}

void MainWindow::paintHighCurve()
{
    QPainter painter(ui->lblHighCurve);

    //抗锯齿
    painter.setRenderHint(QPainter::Antialiasing,true);
    //获取x坐标
    int pointX[6] = {0};
    for(int i=0;i<6;i++)
    {
        pointX[i] = mWeekList[i]->pos().x() + mWeekList[i]->width()/2;
    }

    //获取y坐标
    int tmpSum = 0;
    int tmpAverage = 0;
    for(int i=0;i<6;i++)
    {
        tmpSum+=mDay[i].high;
    }
    tmpAverage = tmpSum/6;
    //计算y轴坐标
    int pointY[6] = {0};
    int yCenter = ui->lblHighCurve->height()/2;
    for(int i=0;i<6;i++)
    {
        pointY[i] = yCenter-((mDay[i].high - tmpAverage)*INCREMENT);
    }
    //开始绘制
    //初始化画笔相关
    QPen pen = painter.pen();
    pen.setWidth(1);                 //设置画笔宽度
    pen.setColor(QColor(255,170,0)); //设置画笔颜色

    painter.setPen(pen);
    painter.setBrush(QColor(255,170,0));
    //画点，画文本
    for(int i=0;i<6;i++)
    {
        painter.drawEllipse(QPoint(pointX[i],pointY[i]),POINT_RADIUS,POINT_RADIUS);

        painter.drawText(pointX[i]-TEXT_OFFSET_X,pointY[i]-TEXT_OFFSET_Y,QString::number(mDay[i].high)+"°");
    }

    for(int i=0;i<5;i++)
    {
        if(i==0)
        {
            pen.setStyle(Qt::DotLine);//虚线
            painter.setPen(pen);
        }
        else
        {
            pen.setStyle(Qt::SolidLine);//实线
            painter.setPen(pen);
        }
        painter.drawLine(pointX[i],pointY[i],pointX[i+1],pointY[i+1]);
    }

}

void MainWindow::paintLowCurve()
{
    QPainter painter(ui->lblLowCurve);

    //抗锯齿
    painter.setRenderHint(QPainter::Antialiasing,true);
    //获取x坐标
    int pointX[6] = {0};
    for(int i=0;i<6;i++)
    {
        pointX[i] = mWeekList[i]->pos().x() + mWeekList[i]->width()/2;
    }

    //获取y坐标
    int tmpSum = 0;
    int tmpAverage = 0;
    for(int i=0;i<6;i++)
    {
        tmpSum+=mDay[i].low;
    }
    tmpAverage = tmpSum/6;
    //计算y轴坐标
    int pointY[6] = {0};
    int yCenter = ui->lblLowCurve->height()/2;
    for(int i=0;i<6;i++)
    {
        pointY[i] = yCenter-((mDay[i].low - tmpAverage)*INCREMENT);
    }
    //开始绘制
    //初始化画笔相关
    QPen pen = painter.pen();
    pen.setWidth(1);                 //设置画笔宽度
    pen.setColor(QColor(0,255,255)); //设置画笔颜色

    painter.setPen(pen);
    painter.setBrush(QColor(0,255,255));
    //画点，画文本
    for(int i=0;i<6;i++)
    {
        painter.drawEllipse(QPoint(pointX[i],pointY[i]),POINT_RADIUS,POINT_RADIUS);

        painter.drawText(pointX[i]-TEXT_OFFSET_X,pointY[i]-TEXT_OFFSET_Y,QString::number(mDay[i].low)+"°");
    }

    for(int i=0;i<5;i++)
    {
        if(i==0)
        {
            pen.setStyle(Qt::DotLine);//虚线
            painter.setPen(pen);
        }
        else
        {
            pen.setStyle(Qt::SolidLine);//实线
            painter.setPen(pen);
        }
        painter.drawLine(pointX[i],pointY[i],pointX[i+1],pointY[i+1]);
    }
}

void MainWindow::onReplied(QNetworkReply *reply)
{
    //qDebug()<<"请求数据成功";
    int status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
    //qDebug()<<"operator:"<<reply->operation();
    //qDebug()<<"status_code:"<<status_code;
    //qDebug()<<"url:"<<reply->url();
    //qDebug()<<"raw header:"<<reply->rawHeaderList();
    if(reply->error()!=QNetworkReply::NoError||status_code!=200)
    {
        qDebug()<<reply->errorString().toLatin1().data();
        QMessageBox::warning(this,"天气","请求数据失败",QMessageBox::Ok);
    }else
    {
        QByteArray byteArray = reply->readAll();
        qDebug()<<"read all:"<<byteArray.data();
        parseJson(byteArray);
    }
}

